/**
 * 公共的功能模块
 */

//导入debug模块，并定义两个名字空间
const debug = require("debug")("market-server:[debug]");
//在www的定义的格式var debug = require('debug')('mybook-server:server');
const error = require("debug")("market-server:[error]");
//导入加密模块
const crypto = require("crypto");

const config = require("./config");


/**
 * JSONData说明
 * 
 * @typedef {Object} JSONData
 * @property {Number} code
 * @property {String} msg
 * @property {(Object | Array)} data
 * 
 */

/**
 * 统一格式返回的JSON数据
 * 200 - 返回成功
 * 201 - 请求成功
 * 204 - 成功响应
 * 
 * 300 - 重定向
 * 301 - 请求失败
 * 
 * 400 - 错误请求
 * 401 - 无访问授限
 * 402 - 无访问权限
 * 403 - 结果为空
 * 404 - 未找到
 * 409 - 冲突
 * 500 - 服务器错误
 * 
 * @param {Number} code  返回自定义的状态码 
 * @param {String} msg - 提示消息
 * @param {Object | Array} data - 数据结果
 * @returns {JSONData}
 */

function FormatJSONData(code, msg="", data=[]){
    if(!data){
        data = [];
    }
    return {code:code,msg:msg,data:data};
}
//例如
// res.status(201).json(util.FormatJSONData(201, '用户创建成功', {
//   user_id: result
// }));



/**
 * 调试信息
 * @param {String} msg - 调试信息
 */
function log(msg){
    debug(msg);
}

/**
 * 带格式调试信息
 * @param {String} formatter - 带格式的字符串例如 %O, %j
 * @param {Object} data - 数据对象
 */
function logFormat(formatter, data){
    debug(formatter,data);
}

/**
 * 错误信息
 * @param {String} msg - 错误信息
 */
function err(msg){
    error(msg);
}


/**
 * 
 * @param {String} password  - 密码
 * @returns {String} - 16进取密码串
 */
function md5Pwd(password){
    let salt = config.salt;
    let md5 = crypto.createHash("md5");
    return md5.update(password+salt).digest("hex");
}

/**
 * 获取客户端真实 IP (支持反向代理)
 * @param {http.IncomingMessage} req - 请求对象
 * @returns {String} 客户端 IP 地址
 */
function getReqRemoteIP(req) {
    const ipSources = [
      () => req.headers['x-client-ip'],
      () => {
        const xForwardedFor = req.headers['x-forwarded-for'];
        return xForwardedFor?.split(/\s*,\s*/)[0];
      },
      () => req.headers['cf-connecting-ip'],    // Cloudflare
      () => req.headers['fastly-client-ip'],    // Fastly
      () => req.headers['fly-client-ip'],       // Fly.io
      () => req.headers['x-real-ip'],           // Nginx
      () => req.headers['x-cluster-client-ip'], // Kubernetes
      () => {
        const socketIP = req.socket?.remoteAddress || req.connection?.remoteAddress;
        return socketIP?.replace(/^::ffff:/, '');
      }
    ];
    const ipRegex = /^([0-9]{1,3}\.){3}[0-9]{1,3}$|^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;
    for (const getIp of ipSources) {
      try {
        const ip = getIp();
        if (ip && ipRegex.test(ip)) {
          return ip.startsWith('::ffff:') ? ip.slice(7) : ip;
        }
      } catch (e) {
        error('IP解析错误:', e);
      }
    }
}


module.exports  = {
    FormatJSONData,
    log,
    logFormat,
    err,
    md5Pwd,
    getReqRemoteIP
}